package br.ufrj.dcc.ad.log;

import java.io.File;
import java.io.IOException;

import org.apache.log4j.Appender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class LoggerFactory {
	public enum Type {
		METRICAS_SIMULACAO("MetricasSimulacao"), METRICAS_ITERACAO("MetricasIteracao"),
		DEBUG("Debug"), RAW_STDOUT("RawStdout"), TIMED_STDOUT("Stdout"),
		METRICAS_CLIENTES_ITERACAO("MetricasClientesIteracao"),
		MEDIANA("Mediana");
		
		private String nome;
		
		Type(String nome) {
			this.nome = nome;
		}
		
		public String getNome() {
			return nome;
		}
		
		public static Type getType(String nome) {
			for(Type t : Type.values()) {
				if(t.getNome().equals(nome)) {
					return t;
				}
			}
			return null;
		}
	}
	public static Logger getLogger(Type tipo) {
		return Logger.getLogger(tipo.getNome());
	}
	
	public static void trocarLog(Logger logger, Integer i) throws IOException {
		logger.setLevel(Level.OFF);
		Type tipo = Type.getType(logger.getName());
		
		if(tipo != null) {
			Appender appender = (Appender) logger.getAppender(tipo.getNome());
			if(appender instanceof FileAppender) {
				FileAppender fileAppender = (FileAppender) appender;
				// Se i é nulo, entao volta pro log anterior.
				if(i == null) {
					fileAppender.setFile(tipo.getNome().concat(".txt"));
				} else { // Senao muda de log.
					File f = new File(tipo.getNome().concat(i.toString()).concat(".txt"));
					if(f.exists()) {
						f.delete();
					}
					fileAppender.setFile(f.getName());
				}
				fileAppender.activateOptions();
			}
		}
		logger.setLevel(Level.DEBUG);
	}
	
	public static void clearAllLogs() {
		File f = null;
		for(Type tipo : Type.values()) {
			f = new File(tipo.getNome().concat(".txt"));
			if(f.exists()) {
				f.delete();
			}
		}
		int i = 0;
		while(true) {
			f = new File(Type.METRICAS_CLIENTES_ITERACAO.getNome().concat(Integer.toString(i)).concat(".txt"));
			if(f.exists()) {
				f.delete();
				++i;
			} else {
				break;
			}
		}
	}
	
	public static void desactiveLogger(Type tipo) {
		Logger logger = LoggerFactory.getLogger(tipo);
		logger.setLevel(Level.OFF);
	}
	
	public static void activeLogger(Type tipo) {
		Logger logger = LoggerFactory.getLogger(tipo);
		logger.setLevel(Level.DEBUG);
	}
}
